概要
Pythonで作った自作関数を使用する時に、意図しない利用や挙動を検出するために、引数と返り値の型をチェックするデコレータを作ってみた。
型アノテーションを利用するため、Python3が前提になります。
内容をログに出すことで、デバッグする際にも役立ちます。
※間違い等ありましたらご指摘お願いします。
方法
デコレータの定義
検証デコレータ
import inspect
def validate_func(func):
def validate_func_wrapper(*args, **kwargs):
sig = inspect.signature(func)
args_value = sig.bind(*args, **kwargs) # 引数名と値のdict
# 引数の検証
for args_name, args_value in args_value.arguments.items():
args_type = sig.parameters[args_name].annotation
# 型が指定されている(not empty)、かつ 型が一致していない場合エラー
if args_type is not inspect._empty and type(args_value) != args_type:
raise Exception('引数の型が異なります')
results = func(*args, **kwargs)
# 返り値の検証
return_type = sig.return_annotation
# 型が指定されている(not empty)、かつ型が一致していない場合エラー
if return_type is not inspect._empty and type(results) != return_type:
raise Exception('返り値の型が異なります')
return results
return validate_func_wrapper
使い方例
使い方例
@validate_func
def test(a:int, b:int = 2) -> int:
return a + b
test(1) # 正常終了
test(1.0) # エラー